package pl.peterjack.servlet.uslugi;

import java.io.IOException;
import java.util.Date;
import java.util.List;

import javax.jdo.PersistenceManager;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.impl.LogFactoryImpl;

import pl.peterjack.SystemTools;
import pl.peterjack.model.PMF;
import pl.peterjack.model.dane.Faktura;
import pl.peterjack.model.dane.FakturaProdukt;
import pl.peterjack.model.dane.Firma;
import pl.peterjack.model.dane.Klient;
import pl.peterjack.model.dane.Pracownik;
import pl.peterjack.model.dane.PracownikUprawnienia;
import pl.peterjack.model.dane.Produkt;
import pl.peterjack.model.dane.RezultatOdpowiedz;
import pl.peterjack.servlet.dane.firma.FirmaDane;

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Transaction;
import com.google.gson.Gson;

public class GenerowanieFaktur extends HttpServlet {
	
	Log log = new LogFactoryImpl().getInstance(FirmaDane.class);

	@SuppressWarnings("unchecked")
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		Pracownik pracownik = (Pracownik) req.getSession().getAttribute("firma_pracownik");
		PracownikUprawnienia pracownikUprawnienie = null;
		if (pracownik != null && pracownik.getPracownikUprawnienia() != null
				&& pracownik.getPracownikUprawnienia().longValue() > 0) {
			pracownikUprawnienie = pm.getObjectById(PracownikUprawnienia.class,
					pracownik.getPracownikUprawnienia());
		}
		if (req.getSession().getAttribute("firma_klient") != null
				|| !(pracownik == null || pracownikUprawnienie == null || (pracownikUprawnienie
						.getWystawienieFaktur() != null && pracownikUprawnienie
						.getWystawienieFaktur().booleanValue()))) {
			req.getSession().invalidate();
			resp.setContentType("text/plain");
			resp.setStatus(resp.SC_MOVED_TEMPORARILY);
			resp.setHeader("Location", "/");
			return;
		}

		Firma firma = (Firma) req.getSession().getAttribute("firma");
		RezultatOdpowiedz result = new RezultatOdpowiedz();
	    Gson gson = new Gson();
	    int liczbaFaktur = Integer.parseInt(req.getParameter("liczbaFaktur")); 
	    for(int i = 0; i < liczbaFaktur; i++) {
	    	DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
		    Transaction txn = datastore.beginTransaction();
	    	int obecnyKlient = Integer.parseInt(req.getParameter("obecnyKlient"+i));
	    	Klient klient = null;
	    	String wygNazwaKlienta = req.getParameter("wygNazwaKlienta"+i); 
		    String wygImie = req.getParameter("wygImie"+i);
		    String wygNazwisko = req.getParameter("wygNazwisko"+i);
	    	String wygAdres = req.getParameter("wygAdres"+i);
    		String wygMiejscowosc = req.getParameter("wygMiejscowosc"+i);
			String wygDataSprzedazy = req.getParameter("wygDataSprzedazy"+i);
			String wygKodPocztowy = req.getParameter("wygKodPocztowy"+i);
			String wygProduktNazwa = req.getParameter("wygProduktNazwa"+i);
			String wygProduktIlosc = req.getParameter("wygProduktIlosc"+i);
			String wygProduktCena = req.getParameter("wygProduktCena"+i);
			String wygUslugaNazwa = req.getParameter("wygUslugaNazwa"+i);
			String wygUslugaCena = req.getParameter("wygUslugaCena"+i);
			String dataWyst = req.getParameter("dataWyst"+i);
			String vat = req.getParameter("vat"+i);
			
			String obecnyProdukt = req.getParameter("obecnyProdukt"+i);
			String obecnaUsluga = req.getParameter("obecnaUsluga"+i);
			// jezeli nie wybrano klienta dodajemy go jako nowego 
			if(obecnyKlient==0) {
				klient = new Klient(); 
		    	klient.setImie( wygImie );
			    klient.setNazwisko( wygNazwisko );
			    klient.setNazwa( wygNazwaKlienta );
			    klient.setAdres( wygAdres ); 
			    klient.setMiejscowosc( wygMiejscowosc );
			    klient.setKodPocztowy( wygKodPocztowy ); 
			    klient.setTelefon( null ); 
			    klient.setEmail( null );
			    klient.setFirma( firma.getId() );
			    try {
			    	pm.makePersistent(klient);
			    } catch (Exception e) {
			    	e.printStackTrace();
			    	result.setSuccess(false); 
				    resp.setCharacterEncoding("UTF-8");
			    	resp.getWriter().println(gson.toJson(result));
			    	return; 
				}
			} else {
				klient = pm.getObjectById(Klient.class, obecnyKlient);
			}
			// szukamy nr faktury
		    String queryStr = "select from " + Faktura.class.getName() + 
	        " where miesiac == :p1 && rok == :p2 && firma == :p3 order by nr desc limit 1";
		    List<Faktura> results = (List<Faktura>)pm.newQuery(queryStr).execute(
		    		new Date(System.currentTimeMillis()).getMonth(), 
		    		new Date(System.currentTimeMillis()).getYear(),
		    		firma.getId());
		    int nr = 0; 
		    if(results.size()>0) {
		    	nr = results.get(results.size()-1).getNr(); 
		    }
		    nr++; 
			// tworzymy fakture 
		    Faktura faktura = new Faktura(); 
		    faktura.setAdres(firma.getAdres());
		    faktura.setDataSprzedazy(new Date(System.currentTimeMillis())); 
		    faktura.setFirma(firma.getId()); 
		    faktura.setKlient(klient.getId()); 
		    faktura.setKodPocztowy(firma.getKodPocztowy()); 
		    faktura.setMiejscowosc(firma.getMiejscowosc()); 
		    faktura.setMiesiac(new Date(System.currentTimeMillis()).getMonth()); 
		    faktura.setNazwa(klient.getNazwa()); 
		    faktura.setNr(nr); 
		    faktura.setRok(new Date(System.currentTimeMillis()).getYear()); 
		    faktura.setWlascicielAdres(firma.getAdres()); 
		    faktura.setWlascicielKodPocztowy(firma.getKodPocztowy()); 
		    faktura.setWlascicielMiejscowosc(firma.getMiejscowosc()); 
		    faktura.setWlascicielNazwa(firma.getNazwa());
		    pm.makePersistent(faktura);
		    float procentVat = SystemTools.parseFloat(vat); 
    		// tworzymy produkt  
		    if (!"-1".equals(obecnyProdukt)) {
		    	float cenaBrutto = SystemTools.parseFloat(wygProduktCena);
	    		float cenaNetto = cenaBrutto*100/(100+procentVat);
	    		Produkt produkt = null;
	    		if ("0".equals(obecnyProdukt)) {
		    		produkt = new Produkt();
		    		produkt.setCenaBrutto(cenaBrutto); 
		    		produkt.setCenaNetto(cenaNetto); 
		    		produkt.setDataDodania(new Date(wygDataSprzedazy)); 
		    		produkt.setFirma(firma.getId()); 
		    		produkt.setNazwa(wygProduktNazwa); 
		    		produkt.setProcentVat(procentVat); 
		    		pm.makePersistent(produkt);
		    	} else {
		    		produkt = pm.getObjectById(Produkt.class, Integer.parseInt(obecnyProdukt));
		    	}
		    	FakturaProdukt fakturaProdukt = new FakturaProdukt(); 
		    	fakturaProdukt.setCenaBrutto(cenaBrutto); 
		    	fakturaProdukt.setCenaNetto(cenaNetto); 
		    	fakturaProdukt.setFaktura(faktura.getId()); 
		    	fakturaProdukt.setIlosc(SystemTools.parseInteger(wygProduktIlosc)); 
		    	fakturaProdukt.setNazwa(wygProduktNazwa); 
		    	fakturaProdukt.setProcentVat(procentVat); 
		    	fakturaProdukt.setProdukt(produkt.getId());
		    	pm.makePersistent(fakturaProdukt);
		    }
		    // komitujemy 
			txn.commit();
			
	    }
	    result.setSuccess(true); 
	    result.setData( null ); 
	    resp.setCharacterEncoding("UTF-8");
		//resp.setContentType("application/json");
        resp.getWriter().println(gson.toJson(result));
	}

	

}

